package com.etime.shycourse.orde.services.interfaces;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.etime.shycourse.orde.dto.OrderDetailDto;
import com.etime.shycourse.orde.dto.OrderDetails;
import com.etime.shycourse.orde.dto.stateNumDto;
import com.etime.shycourse.orde.pojo.Orders;
import com.etime.shycourse.pojo.SysUser;
import com.etime.shycourse.wx.applets.pojo.Course;
import com.etime.shycourse.wx.applets.pojo.Orderdetail;

import java.util.List;


/**
 * @author wb
 * @since 2022-01-10
 */
public interface WxOrdersServices {
    /**
     * 统计订单状态的数量
     * 查询订单的状态   //1--创建     2--完成	     3--关闭	      4--退款
     */
    stateNumDto selectStateNumDto();

    /**
     * 插入 订单+订单详情数据
     *
     * @param orderDetails
     * @return OrderId
     */
    int insertOrderDetails(OrderDetails orderDetails, String token);

    /**
     * 支招下订单 2022-03-01 10:30:58 复制微信下订单的接口
     * 插入 订单+订单详情数据
     *
     * @param dto
     * @return OrderId
     */
    int insertSupportOrderDetails(OrderDetails dto, String token);

    /**
     * 购物车 下单接口 重写
     * 插入 订单+订单详情数据
     *
     * @param orderDetails
     * @return OrderId
     */
    int insertOrderDetailsByCar(OrderDetails orderDetails, String token);

    /**
     * 只创建订单 ，没有详情 返回订单id
     *
     * @return orderid
     */
    int insertOrder(Orders orders);

    /**
     * 根据订单id 获取订单详情 sql复杂
     * selectOrderDetailsByOrderId
     *
     * @param orderId
     * @return Orders
     */
    @Deprecated
    Orders selectOrderDetailsByOrderId(Integer orderId);

    /**
     * 根据订单id 获取订单详情
     * selectOrderDetailsByOrderId
     *
     * @param orderId
     * @return Orders
     */
    Orders selectOrderDetailsByOrderIds(Integer orderId);

    /**
     * 支招
     * 根据订单id 获取订单详情
     * selectOrderDetailsByOrderId
     *
     * @param orderId
     * @return Orders
     */
    Orders selectSupportOrderDetailsByOrderIds(Integer orderId);

    /**
     * 小程序我的订单 我的课程数据接口
     * orderState 待付款，已付款，全部，取消订单，
     * ordercreatetime 按时间降序排列
     *
     * @param token
     * @return List<Orders>
     */
    List<Orders> selectOrderDetailsByUserId(String token, Integer orderState);

    /**
     * 关闭订单必须要填写关闭订单的原因。如果没有填写，则不能关闭。
     * 关闭订单需要修改orders 表的如下字段内容：
     * 前端写入 关闭交易描述	orderclosedesc =输入内容
     * <p>
     * 后台添加 交易关闭时间	orderclosetime	=当前时间
     * 后台添加 关闭交易用户id	ordercloseuserid =登录用户id
     * 后台添加 关闭交易用户姓名orderclosename =登录用户姓名
     * 订单状态 没有传 则后台添加 orderstate = 3
     * <p>
     * upDataOrderById(String token, Orders order)
     *
     * @param order 根据订单id 进行修改
     * @return int
     */
    int upDataOrderById(String token, Orders order);

    /**
     * 2022 - 02 - 10 16:41:37
     * 判断创建订单时 用户是否已经购买其课程(订单为 创建、完成)
     * 存在返回 true
     *
     * @param dto
     * @return boolean
     */
    @Deprecated
    List<Integer> iFBuyCourse(OrderDetailDto dto, String token);

    /**
     * 在购物车中 下订单前 使用
     * 根据用户id 判断用户是否有跟本课时
     * 有订单未完成的情况
     *
     * @param List
     * @param token
     * @return Integer  有返回1 没有返回0
     */
    Integer iFBuyCarLesson(List<Orderdetail> List, String token);

    /**
     * 临时后台管理用创建订单
     * 先创建定 返回订单号
     */
    int insetCourseTemporary(OrderDetails orders, SysUser sysuser);

    /**
     * 创建订单明细 临时后台管理用创建订单
     *
     * @param dto
     * @return int
     */
    int insetOrderdetailList(OrderDetails dto, String token);

    /**
     * 小程序我的已购课程
     *
     * @param token ->userID
     * @return List<Course>
     */
    List<Course> searchAllBy(String token);

    /**
     * 根据id查询订单详情
     *
     * @param orderid 订单id
     * @return
     */

    Orders selectOrdersById(int orderid);

    /**
     * 判断永恒有没有
     * 未购买的订单有返回订单id
     * 当用户 有订单存在 状态为1  返回第一个订单id
     * //没有返回0
     *
     * @param token
     * @return int
     */
    int selectByCatOrdersByUserId(String token);

    /**
     * 小程序我的订单 分页
     * orderState 待付款，已付款，全部，取消订单，
     * ordercreatetime 按时间降序排列
     *
     * @param token
     * @param orderState 状态
     * @param pagenum
     * @param pagesize
     * @return List<Orders>
     */
    Page<Orders> selectOrderDetailsPageByUserId(String token, Integer orderState, Long pagenum, Long pagesize);
}
